package com.stylefeng.guns.core.redis;

import java.util.Set;

/**
 * <pre>
 * 调用Redis缓存服务业务管理
 * </pre>
 * 
 * @author zcj Exp
 * @Date 2017年12月6日 下午12:43:29
 * @since 1.0
 */
public interface RedisService {
	/**
	 * <pre>
	 * 简单对Redis增加缓存
	 * </pre>
	 * 
	 * @param key
	 * @param value
	 */
	void addKeyValue(String key, String value);

	/**
	 * <pre>
	 * 简单的对Redis增加缓存信息，并设置缓存过期时间，这里单位是秒
	 * </pre>
	 * 
	 * @param key
	 * @param value
	 * @param times
	 */
	void addKeyValue(String key, String value, int timeout);

	/**
	 * <pre>
	 * 根据key获取缓存的值信息
	 * </pre>
	 * 
	 * @param key
	 * @return
	 */
	String getValue(String key);
	
	/**
	 * 根据key删除缓存
	 * @param key
	 */
	void deleteValue(String key);
	
	/**
	 * 取得缓存（字符串类型）
	 * @param key
	 * @return
	 */
	public String getStr(String key);
	/**
	 * 取得缓存（字符串类型）
	 * @param key
	 * @return
	 */
	public String getStr(String key, boolean retain);
	
	/**
	 * 获取缓存<br>
	 * 注：基本数据类型(Character除外)，请直接使用get(String key, Class<T> clazz)取值
	 * @param key
	 * @return
	 */
	public Object getObj(String key);
	
	/**
	 * 获取缓存<br>
	 * 注：java 8种基本类型的数据请直接使用get(String key, Class<T> clazz)取值
	 * @param key		
	 * @param retain	是否保留
	 * @return
	 */
	public Object getObj(String key, boolean retain);
	
	/**
	 * 获取缓存<br>
	 * 注：该方法暂不支持Character数据类型
	 * @param key	key
	 * @param clazz	类型
	 * @return
	 */
	public <T> T get(String key, Class<T> clazz);
	
	/**
	 * 将value对象写入缓存
	 * @param key
	 * @param value
	 * @param time 失效时间(秒)
	 */
	public void set(String key,Object value);
	
	/**
	 * 将value对象写入缓存
	 * @param key
	 * @param value
	 * @param time 失效时间(秒)
	 */
	public void set(String key,Object value,long time);
	
	/**
	 * 根据可以删除对象型值
	 * @param key
	 */
	public void deleteObject(String key);
	
	/**
	 * 根据某个前缀获取key集合
	 * @param pattern
	 * @return
	 */
	public Set<String> keysPattern(String pattern);
	
	/**
	 * 生产者发送消息到消息队列
	 * @param channel
	 * @param message
	 */
	public void sendMessage(String channel,Object message);

	/**
	 * 获取剩余过期时间
	 * @param key
	 * @return
	 */
	Long getExpire(String key);

	/**
	 * 更改key对应的value值但是不影响过期时间
	 * @param key
	 * @param value
	 * @return
	 */
	void setForExpire(String key, Object value);

}
